package edu.whu.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.whu.demo.dao.UserDao;
import edu.whu.demo.domain.UserDto;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import edu.whu.demo.domain.User;

@Service
// 定义一个UserService类，继承自ServiceImpl类，实现UserDao和User接口
public class UserService extends ServiceImpl<UserDao, User>{
    // 自动注入UserDao对象
    @Autowired
    UserDao userDao;

    // 使用缓存注解，将getUser方法的结果缓存到名为"user"的缓存中，缓存键为传入的name参数，条件为name不为null
    @Cacheable(cacheNames = "user", key = "#name",condition = "#name!=null")
    public UserDto getUser(String name){
        // 调用UserDao的getUser方法，传入name参数，返回结果
        return userDao.getUser(name);
    }

    // 使用缓存注解，清除名为"user"的缓存中，键为传入的userName参数对应的缓存项
    @CacheEvict(cacheNames = "user",key = "#userName")
    public void deleteUser(String userName) {
        // 调用UserDao的deleteById方法，传入userName参数，删除对应的用户
        userDao.deleteById(userName);
    }

    // 使用缓存注解，清除名为"user"的缓存中，键为传入的user对象的name属性对应的缓存项
    @CacheEvict(cacheNames = "user",key = "#user.name")
    public void updateUser(User user) {
        // 调用UserDao的updateById方法，传入user参数，更新对应的用户信息
        userDao.updateById(user);
    }

    // 添加用户的方法，首先对密码进行加密，然后调用UserDao的insert方法，插入新的用户
    public void addUser(User user){
        // 使用BCryptPasswordEncoder对密码进行加密
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        // 调用UserDao的insert方法，插入新的用户
        userDao.insert(user);
    }
}